\documentclass{ctexart}

\usepackage{amsmath} 
\usepackage{listings}

\lstset{
basicstyle=\ttfamily,
columns=fullflexible,%可以自动换行
linewidth=1\linewidth, %设置代码块与行同宽
breaklines=true,%在单词边界处换行。
showstringspaces=false， %去掉空格时产生的下划的空格标志, 设置为true则出现
breakatwhitespace=ture,%可以在空格处换行
escapechar=`%设置转义字符为反引号
}

\title{code report of project}
\author{谢飞扬\\  信息与计算科学 3210104010}
\date{\today}

\begin{document}
\maketitle
\setlength{\parindent}{0pt}

\section{项目设计思路}

\subsection{文件架构}
spline文件实现了spline的各种模板类,polynomial文件完成了多项式类,funlib.h存储了题目所需函数,
jsonprocess文件负责从json文件格式读取参数,tool.hpp则实现了一些工具函数,例如方程求解,样条求值,输出曲线txt文件等.
fileoutput.cpp用于生成曲线拟合的参数文件,存储在jsonfile目录下,main.cpp中完成了题目A-E,并将画图所需参数以文件txt形式输出,
存储在txtfile目录下,plot.py则负责生成图像,图像存储在picfile下.


\subsection{设计思路}
底层架构上先完成了多项式类,再将多项式的数组封装成样条类.此次作业我参照助教在ppt中给出的设计框架.即将样条写成类模板,
再进行模板特化.但实际上写完后我认为这种方式并不是最佳实现,因为模板特化,导致不能在类之间进行继承,使代码的复用性和扩展性有所下降.
(不过已经没时间改了,下面简单说一下我认为更好的思路).我认为可以把Dim和Order作为成员函数fitCurve的模板参数.
从而对函数模板进行特化,这样在为不同的参数定制实现的同时,又能在类之间进行继承,提高代码复用性.

\subsection{类的接口,功能与关系}
多项式类实现了常用构造函数,各种运算符号的重载及求导和积分的实现,内部维护了一个系数向量vector<double>.
样条类只提供了一个接口,fitCurve用于拟合函数,函数接口参照助教的ppt设计,功能上最终将分段多项式的的计算结果保存在类中.
样条内部维护了一个多项式类数组.B样条和基数B样条还多维护了一个B样条基函数的数组,底层为N+Order-1个分段多项式,
并且多了一个私有成员函数setBasic,用于递归生成基函数.
因为使用了类模板特化,所以没有派生类,各个样条类的关系只是特化.

\section{实验报告}

\subsection*{项目要求实现说明}
1.pp样条实现了$S_1^0$和$S_3^2$,且$S_3^2$支持complete,specified\ second\ derivatives和natural三种边界条件.\\
2.B样条实现了$S_n^{n-1}$插值,支持periodic边界条件.\\
3.完成了基数B样条的定理3.57和3.58实现.\\
4.支持函数和曲线拟合,且接口统一,函数拟合以维度参数进行标记,维度为1时代表函数拟合,否则为曲线拟合.\\
5.所有参数以json file格式实现.\\
6.A-E均已完成.\\
7.实现了计算误差收敛阶的函数,采用取ln并进行线性回归的方式计算.\\

\subsection*{problem A}
这题我使用了三阶完全边界条件pp样条(其他两个边界条件都已实现,未在本题中给出),画图用python实现,图片在picfile目录下.
根据子区间数量和,题目定义误差计算了结果,并且对其取对数再用最小二乘法进行线性回归,得出了收敛阶数.
数据如下:\\
\begin{lstlisting}[breaklines=true]
num of subinterval: 5   error: 0.421705
num of subinterval: 10  error: 0.0205289
num of subinterval: 20  error: 0.00316894
num of subinterval: 40  error: 0.000275356
num of subinterval: 80  error: 1.609e-05
Convergence Order: 3.55758
\end{lstlisting}

\subsection*{problem BCD}
根据书本定理3.57和3.58实现了cubic和quadratic基数B样条,图片在picfile目录下.
误差计算如下,由于有些点是插值点,所以误差接近机器精度,甚至是0.
事实上,根据图片可以看出,cubic样条更准确基数B样条,因为阶数更高,而且边界的导数条件保证了插值函数的走向.\\
\begin{lstlisting}[breaklines=true]
error1             error2
0.000669568     1.249e-16
5.55112e-16    0.00141838
  0.0205289             0
1.11022e-16      0.120238
  0.0205289             0
1.38778e-16    0.00141838
0.000669568   1.38778e-17
\end{lstlisting}

\subsection*{problem E}
采用了三阶的周期B样条,绘制了精确的曲线,及插值曲线,图片在picfile目录下.可以看到n越大,拟合效果越好.

\end{document}
